package com.snail.clouds.common.utils;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.DES;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;

/**
 * 加密解密工具类
 * 基于Hutool的加密解密工具封装
 */
public class CryptoUtil {
    
    /**
     * MD5加密
     * @param data 数据
     * @return MD5摘要
     */
    public static String md5(String data) {
        return DigestUtil.md5Hex(data);
    }
    
    /**
     * SHA1加密
     * @param data 数据
     * @return SHA1摘要
     */
    public static String sha1(String data) {
        return DigestUtil.sha1Hex(data);
    }
    
    /**
     * SHA256加密
     * @param data 数据
     * @return SHA256摘要
     */
    public static String sha256(String data) {
        return DigestUtil.sha256Hex(data);
    }
    
    /**
     * AES加密
     * @param data 数据
     * @param key 密钥
     * @return 加密后的数据
     */
    public static String aesEncrypt(String data, String key) {
        AES aes = SecureUtil.aes(key.getBytes(StandardCharsets.UTF_8));
        return aes.encryptHex(data);
    }
    
    /**
     * AES解密
     * @param data 数据
     * @param key 密钥
     * @return 解密后的数据
     */
    public static String aesDecrypt(String data, String key) {
        AES aes = SecureUtil.aes(key.getBytes(StandardCharsets.UTF_8));
        return aes.decryptStr(data);
    }
    
    /**
     * DES加密
     * @param data 数据
     * @param key 密钥
     * @return 加密后的数据
     */
    public static String desEncrypt(String data, String key) {
        DES des = SecureUtil.des(key.getBytes(StandardCharsets.UTF_8));
        return des.encryptHex(data);
    }
    
    /**
     * DES解密
     * @param data 数据
     * @param key 密钥
     * @return 解密后的数据
     */
    public static String desDecrypt(String data, String key) {
        DES des = SecureUtil.des(key.getBytes(StandardCharsets.UTF_8));
        return des.decryptStr(data);
    }
    
    /**
     * 生成AES密钥
     * @return AES密钥
     */
    public static String generateAesKey() {
        SecretKey secretKey = SecureUtil.generateKey("AES");
        return cn.hutool.core.codec.Base64.encode(secretKey.getEncoded());
    }
    
    /**
     * 生成DES密钥
     * @return DES密钥
     */
    public static String generateDesKey() {
        SecretKey secretKey = SecureUtil.generateKey("DES");
        return cn.hutool.core.codec.Base64.encode(secretKey.getEncoded());
    }
}